/**
  ****************************(C) COPYRIGHT 2019 DJI****************************
  * @file       can_receive.c/h
  * @brief      这里是CAN中断接收函数，接收电机数据,CAN发送函数发送电机电流控制电机.
  * @note       
  * @history
  *  Version    Date            Author          Modification
  *  V1.0.0     Dec-26-2018     RM              1. done
  *  V1.1.0     Nov-11-2019     RM              1. support hal lib
  @verbatim
  ==============================================================================
  ==============================================================================
  @endverbatim
  ****************************(C) COPYRIGHT 2019 DJI****************************
  */

#ifndef CAN_RECEIVE_H
#define CAN_RECEIVE_H

#include "main.h"
#include "remote_control.h"

#define obtein_CAN	      	hcan1
#define chassis_CAN         hcan2
#define friction_CAN	    	hcan1

#define CAN_gimbal_A_ID		         0x100    //云台A板ID
#define CAN_CHASSIS_A_ID		       0x101    //底盘A板ID

#define CAN_ENGINEER_ALL_ID		     0x200
#define CAN_translation_MOTOR_ID   0x201
#define CAN_Clamp_turn_MOTOR1_ID   0x202
#define CAN_Clamp_turn_MOTOR2_ID   0x203

#define CAN_friction_ALL_ID        0x1FF    
#define CAN_friction_MOTOR1_ID	   0x205
#define CAN_friction_MOTOR2_ID     0x206
#define CAN_friction_MOTOR3_ID     0x207
#define CAN_friction_MOTOR4_ID     0x208

#define HALF_ECD_RANGE              4096
#define ECD_RANGE                   8191

//rm motor data
typedef struct
{
    uint16_t ecd;                  //转子机械角度
    int16_t speed_rpm;             //转子转速
    int16_t given_current;		     //电机实际转矩电流
    uint8_t temperate;
    int16_t last_ecd;              
    int16_t ecd_count;             //电机编码器计数
} motor_measure_t;


//接收底盘A板数据，具体数据 后续待定
typedef struct
{
	 //控制yaw轴两个方向变化
	bool_t top_limit_flg;
	bool_t button_limit_flg;

}can_receive_t;

//发送数据到底盘A板
typedef struct
{
	int8_t x_speed;
	int8_t y_speed;
	int8_t z_speed;
	int8_t go_down_speed;     

	uint8_t state_flag;    
	uint8_t cail_flg;      
	const RC_ctrl_t * rc_to_cahssis;       
                             
}can_transmit_t;



/**
  * @brief          发送 夹具旋转 横向臂 电机控制电流(0x201)
  * @param[in]      motor_2: (0x202) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor_3: (0x203) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor_4: (0x204) 3508电机控制电流, 范围 [-16384,16384]
  * @retval         none
  */
extern void CAN_cmd_engineering(int16_t motor_translation,int16_t motor_Clamp_turn1, int16_t motor_Clamp_turn2);
/**
  * @brief          向底盘A板发送控制数据     by 江宽
  * @param[in]      待发送的数据
  * @retval         none
  */
extern void CAN_cmd_chassis_C(can_transmit_t* can_transmit_data);
/**
  * @brief          发送摩擦轮电机控制电流
  * @param[in]      motor_1: (0x205) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor_2: (0x206) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor_3: (0x207) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor_4: (0x208 ) 3508电机控制电流, 范围 [-16384,16384]
  * @retval         none
  */
extern void CAN_cmd_friction(int16_t motor_friction_1, int16_t motor_friction_2, int16_t motor_friction_3, int16_t motor_friction_4);
/**
  * @brief          返回夹具电机 3508电机数据指针
  * @param[in]      i: 电机编号,范围[1，2]
  * @retval         电机数据指针
  */
extern const motor_measure_t* get_Clamp_turn_motor_measure_point(uint8_t i);
/**
  * @brief          返回横向臂电机 3508电机数据指针
  * @param[in]      i: 电机编号,范围[3]
  * @retval         电机数据指针
  */
extern const motor_measure_t* get_translation_motor_measure_point(void);
/**
  * @brief          返回摩擦轮电机 2006电机数据指针
  * @param[in]      i: 电机编号,范围[4，6]
  * @retval         电机数据指针
  */
extern const motor_measure_t* get_friction_motor_measure_point(uint8_t i);

/**
  * @brief          返回底盘数据
  * @param[in]      i:
  * @retval         电机数据指针
  */
extern const can_receive_t* get_chassis_A_point(void);

#endif
